package work1;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SJF {
	private List<Job> jobList;

	//数组列表是一种灵活的数据结构，可以方便地在队列头部和尾部进行操作。
	// 在SJF调度算法中，每次作业执行完毕后，都需要将其重新加入队列的尾部，数组列表可以方便地实现这一点。
	public SJF() {
		jobList = new ArrayList<>();
	}

	public void addJob(Job job) {
		jobList.add(job);
	}

	public void schedule() {
		int currentTime = 0;
		int numJobs = jobList.size();

		// 按照到达时间对作业进行排序
		jobList.sort((j1, j2) -> j1.arrivalTime - j2.arrivalTime);

		//就绪队列
		List<Job> readyQueue = new ArrayList<>();

		int i = 0;
		while (i < numJobs ||!readyQueue.isEmpty()) {
			// 将到达时间小于等于当前时间的作业添加到就绪队列
			while (i < numJobs && jobList.get(i).arrivalTime <= currentTime) {
				readyQueue.add(jobList.get(i));
				i++;
			}

			// 如果就绪队列为空，说明当前没有可执行的作业，将时间推进到下一个作业的到达时间
			if (readyQueue.isEmpty()) {
				currentTime = jobList.get(i).arrivalTime;
				continue;
			}

			// 按照执行时间对就绪队列中的作业进行排序，找到执行时间最短的作业
			readyQueue.sort((j1, j2) -> j1.conductTime - j2.conductTime);

			Job job = readyQueue.remove(0);

			System.out.println("作业名：" + job.jobName);
			System.out.println("到达时间：" + job.arrivalTime);
			System.out.println("执行时间：" + job.conductTime);

			currentTime = Math.max(currentTime, job.arrivalTime);
			currentTime += job.conductTime;

			System.out.println("作业执行结束：" + currentTime);

			System.out.println();
		}
	}

	public static void main(String[] args) {
		SJF sjf = new SJF();
		sjf.addJob(new Job("作业一", 0, 8));
		sjf.addJob(new Job("作业二", 4, 3));
		sjf.addJob(new Job("作业三", 5, 6));
		sjf.addJob(new Job("作业四", 5, 2));
		sjf.addJob(new Job("作业五", 8, 4));
		sjf.addJob(new Job("作业六", 10, 6));
		sjf.schedule();
	}
}